node学习笔记——简单的静态资源文件管理

在 node 中管理静态资源文件与C#、JAVA 等语言不同,具体不同如下:

不存在web容器

nodejs 不像 apache 一样存在容器,nodejs 不存在容器的概念,都是通过路由来控制的,访问路径跟文件夹和文件名没有任何关系。

让 node.js 提供一个静态服务,都非常难!

也就是说,node.js中,如果看见一个网址是:1127.0.0.1:3000/fang,别再去想,一定有一个文件夹,叫做fang了。可能/fang的物理文件,是同目录的test.html

URL和真实物理文件,是没有关系的。URL是通过了Node的顶层路由设计,呈递某一个静态文件的。

简单的静态资源管理实现

由于 node 不存在web容器的概念,所以需要通过路由控制访问的路径文件,具体node是怎么做的呢?我们可以看看简单的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
var http = require("http");
var fs = require("fs");
var url = require("url");
var path = require("path");

var server = http.createServer(function(req,res){
//这里如果不用req.url来if判断,那么用户不管输入什么网址,
//做的事情都一样啊
//得到地址
var pathname = url.parse(req.url).pathname;
//判断此时用户输入的地址是文件夹地址还是文件地址
//如果是文件夹地址,那么自动请求这个文件夹中的index.html
if(pathname.indexOf(".") == -1){
pathname += "/index.html";
}
//输入的网址是127.0.0.1/images/logo.png
//实际请求的是./static/images/logo.png
var fileURL = "./" + path.normalize("./static/" + pathname);
//得到拓展名
var extname = path.extname(pathname);

//把文件读出来
fs.readFile(fileURL,function(err,data){
//读完之后做的事情
if(err){
//文件不存在
res.writeHead(404,{"Content-Type":"text/html;charset=UTF8"})
res.end("404,页面没有找到");
}
//成功之后做的事情
getMime(extname,function(mime){
res.writeHead(200,{"Content-Type":mime})
res.end(data);
});
});
});

server.listen(80,"127.0.0.1");

function getMime(extname,callback){
//读取mime.json文件,得到JSON,根据extname key ,返回对应的value
//读取文件
fs.readFile("./mime.json",function(err,data){ //mime.json是一个根据文件的扩展名设置Content-Type的mime值
if(err){
throw Error("找不到mime.json文件!");
return;
}
//转成JSON
var mimeJSON = JSON.parse(data);
var mime = mimeJSON[extname] || "text/plain";
//执行回调函数,mime类型字符串,就是它的参数
callback(mime);
});
}

像 apache 这样的web容器里面,就封装了类似这样的实现,当然,它的实现比这样完善和复杂很多,还有考虑缓存啊,安全性等各种问题,以上就是node 管理静态资源文件的简单实现。



完~